// 定义块大小为5M
const CHUNK_SIZE = 1024 * 1024 * 5 // 5M
// 定义线程数为硬件并发数，如果没有则默认为4
const THREAD_COUNT = navigator.hardwareConcurrency || 4

// 导出一个异步函数，用于切割文件
export async function cutFile(file: File) {
  // 返回一个Promise对象
  return new Promise((resolve) => {
    // 计算文件的总块数
    const chunkCount = Math.ceil(file.size / CHUNK_SIZE)
    // 计算每个线程处理的块数
    const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT)
    // 存储每个线程处理的结果
    const result: any[] = []
    // 记录已经完成的线程数
    let finishCount = 0
    // 创建一个Web Worker
    const worker = new Worker('./worker.js', {
      type: 'module'
    })
    // 循环创建线程
    for (let i = 0; i < THREAD_COUNT; i++) {
      // 计算每个线程处理的起始和结束位置
      const start = i * threadChunkCount
      const end = Math.min((i + 1) * threadChunkCount, chunkCount)
      // 向Web Worker发送消息
      worker.postMessage({
        file,
        start,
        end,
        chunkSize: CHUNK_SIZE
      })
      // 监听Web Worker的消息
      worker.onmessage = async (e) => {
        // 将每个线程处理的结果存储到result数组中
        result[i] = e.data
        // 终止Web Worker
        worker.terminate()
        // 记录已经完成的线程数
        finishCount++
        // 如果所有线程都完成，则resolve Promise
        if (finishCount === THREAD_COUNT) {
          resolve(result)
        }
      }
    }
  })
}
